/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package swatsoft3.controlador;

import java.io.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import swatsoft3.dao.DAO_MySQL;
import swatsoft3.modelo.*;

/**
 *
 * @author renzo
 */
public class BL_AdministradorDeReportes {

    //Falta guardar el documento PDF en base y Verificar que no se repita
    //Devuelve un arreglo de arreglos de strings, como el datagrid
    public static String procesarDocumento(String directorio, BE_TString error, JTextArea listaDocs, JLabel lblProcesados, JLabel lblOmitidos) {

        
        //Inicializar variables a utilizar 
        String resultado = null;

        BL_GestorArchivos gestorArchivos = null;
        //Verificar que el directorio exista
        try {
            gestorArchivos = new BL_GestorArchivos(directorio);
        } catch (Exception e) {
            error.setCadena("Error al ingresar al directorio indicado.");
            return null;
        }

        //Verificar que solo haya PDF
        try {
            boolean soloPDF = true;
            soloPDF = verificarArchivosSoloPDF(directorio);

            if (!soloPDF) {
                error.setCadena("El directorio contiene archivos que no son de tipo PDF.");
                return null;
            }
        } catch (Exception e) {
            error.setCadena("Error al ingresar al directorio indicado.");
            return null;
        }

        int procesados = 0;
        int omitidos = 0;

        //Aquí empieza el algoritmo
        try {

            //Definir variables a utilizar
            String archivoEnTexto = "";
            String nomArchivoTemporal = "";
            BE_Documento documento = new BE_Documento();
            ArrayList<String> rutaYArchivo = null;
            //Instanciar el conversorAPDF
            BL_PDFTextParser conversorPDF = new BL_PDFTextParser();
            listaDocs.setRows(gestorArchivos.getTotal()+1);
            
            //Se recorre cada archivo del directorio con el gestor de archivos
            while ((rutaYArchivo = gestorArchivos.dameSiguienteArchivo()) != null) {
                //1- Convertir un PDF a txt
                boolean yaExiste = false;
                yaExiste = DAO_MySQL.verificaExiste(rutaYArchivo.get(1));

                if (!yaExiste) {
                    try {

                        archivoEnTexto = conversorPDF.pdftoText(rutaYArchivo.get(0) + rutaYArchivo.get(1));

                        //cambiar la parte que dice .pdf por .txt
                        nomArchivoTemporal = rutaYArchivo.get(1).substring(0, rutaYArchivo.get(1).length() - 4) + ".txt";
                        System.out.println(nomArchivoTemporal);

                        //Escribir el archivo temporalmente
                        conversorPDF.writeTexttoFile(archivoEnTexto, nomArchivoTemporal);
                    } catch (Exception e) {
                        error.setCadena("Error al convertir el archivo " + rutaYArchivo.get(1));
                        return null;
                    }

                    //Procesamiento sintáctico
                    try {
                        documento = BL_GestorAlgoritmo.procesamientoSintactico(nomArchivoTemporal);
                    } catch (Exception e) {
                        error.setCadena("Error en el procesamiento sintáctico del archivo " + rutaYArchivo.get(1));
                        return null;
                    }

                    //Procesamiento semántico
                    try {
                        BL_GestorAlgoritmo.procesamientoSemantico(documento);
                    } catch (Exception e) {
                        error.setCadena("Error en el procesamiento semántico del archivo " + rutaYArchivo.get(1));
                        return null;
                    }

                    //Guardado en Base del documento, incluyendo su título y ruta
                    documento.setTitulo(rutaYArchivo.get(1));
                    documento.setRuta(rutaYArchivo.get(0) + rutaYArchivo.get(1));
                    DAO_MySQL.guardaDocumentoProcesado(documento);

                    //Borrar el archivo temporal
                    conversorPDF.deleteFile(nomArchivoTemporal);
                    listaDocs.setText(listaDocs.getText()+"\nSe procesó el documento " + rutaYArchivo.get(1));
                    procesados ++;
                }
                else
                {
                    listaDocs.setText(listaDocs.getText()+"\nSe omitió el documento " + rutaYArchivo.get(1));
                    omitidos ++;
                }
                
                lblProcesados.setText("Total procesados: "+procesados);
                lblOmitidos.setText("Total omitidos: "+omitidos);
            }
            //NOTA: Falta consulta con lista de arcchivos para no procesar dos veces
        } catch (Exception e) {
            error.setCadena("Ocurrió un error durante el análisis de los documentos.");
            return null;
        }

        return resultado;
    }

    public static ArrayList<ArrayList<String>> generarReporte(String terminoBuscado, BE_TString error) {

        ArrayList<ArrayList<String>> resultado = null;
        ArrayList<ArrayList<String>> resultadoFinal = new ArrayList<ArrayList<String>>();
        ArrayList<String> resultadoAnalisisTerminoBuscado;

        //Verificar que se ingresó una enfermedad
        try {
            resultadoAnalisisTerminoBuscado = BL_GestorMetamap.obtenerConceptoUnicoYTipoSemantico(terminoBuscado);

            //Esta verificación es para evitar problemas con nulos
            if (resultadoAnalisisTerminoBuscado != null) {
                String tipoSemantico = resultadoAnalisisTerminoBuscado.get(0);

                if (tipoSemantico.equalsIgnoreCase(BL_GestorMetamap.enfermedad)) {
                    //Correcto, es una enfermedad si coincide con cualquiera de los tipos antes listados
                    //conceptoUnicoBuscado = "Breast Cancer";
                } else {
                    error.setCadena("El término ingresado no es reconocido como una enfermedad.");
                    return null;
                }
            }
        } catch (Exception e) {
            error.setCadena("Error al procesar la enfermedad buscada.");
            return null;
        }

        //Análisis de correferencia y de relaciones, no se espera errores críticos

        //

        try {
            int minimo = DAO_MySQL.dameMinimo();
            int total = DAO_MySQL.dameTotal();
            int tope = minimo + total;

            for (int i = minimo; i < tope; i++) {
                ArrayList<BE_Oracion> listaCorreferencia;
                BE_Documento documento = DAO_MySQL.leeDocumentoProcesado(i);
                listaCorreferencia = BL_GestorAlgoritmo.analizaCorreferencia(documento, terminoBuscado);
                resultado = BL_GestorAlgoritmo.imprimeSintomasYCuras(listaCorreferencia, documento.getTitulo());

                for (ArrayList<String> auxA : resultado) {

                    //heurísticas
                    if (auxA.get(3).equalsIgnoreCase("Symptoms") || auxA.get(3).equalsIgnoreCase("Treatment") || auxA.get(3).equalsIgnoreCase("Therapy") || auxA.get(3).equalsIgnoreCase("Division")); else {
                        resultadoFinal.add(auxA);
                    }

                    for (String cadena : auxA) {
                        System.out.println(cadena);
                    }
                }
            }

        } catch (Exception ex) {
            System.out.println("Error en generar reporte");
        }

        return resultadoFinal;
    }

    public static boolean verificarArchivosSoloPDF(String directorio) throws Exception {
        BL_GestorArchivos gestorArchivos = new BL_GestorArchivos(directorio);
        ArrayList<String> rutaYArchivo = null;
        String extension;
        boolean resultado = true;

        while ((rutaYArchivo = gestorArchivos.dameSiguienteArchivo()) != null) {
            //cambiar la parte que dice .pdf por .txt
            extension = rutaYArchivo.get(1).substring(rutaYArchivo.get(1).length() - 4, rutaYArchivo.get(1).length());
            if (extension.compareTo(".pdf") != 0) {
                resultado = false;
                return resultado;
            }
        }

        return resultado;
    }
}